package org.zetaframework.core.logback;

import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import cn.hutool.core.util.StrUtil;
import org.zetaframework.core.constants.Constants;

/**
 * Logback MDC traceId格式化器
 *
 * <pre>
 * 用于在日志输出中添加traceId信息，格式为：[traceId]
 * 通过读取MDC中的traceId值，将其格式化后添加到日志输出中。
 * 如果MDC中不存在traceId或traceId为空，则返回空字符串。
 * </pre>
 *
 * 使用示例：<br>
 * logback-spring.xml
 * <pre>{@code
 *                                       ↓↓
 *     <conversionRule conversionWord="traceId"
 *                     converterClass="org.zetaframework.core.logback.TraceIdFormatter" />
 *
 *                                                      ↓↓
 *    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %traceId %logger{36} - %msg%n
 * }</pre>
 *
 * @author gcc
 */
public class TraceIdFormatter extends ClassicConverter {

    @Override
    public String convert(ILoggingEvent event) {
        String traceId = event.getMDCPropertyMap().get(Constants.TRACE_ID);
        if (StrUtil.isBlank(traceId)) { return StrUtil.EMPTY; }

        return StrUtil.format("[{}] ", traceId);
    }
}
